/*
 * sysmo 服务器已连接监控项信息
 * Copyright (C) 2009  YuLicheng
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.sysmo.server.node.item;

import java.util.List;
import org.sysmo.communication.CommunicationInterface;
import org.sysmo.db.DatabaseInterface;

/**
 * 
 * 已连接客户端的监控项。这类监控项不仅能够查看历史图表，还能够对某其进行远程
 * 配置。
 *
 * @author YuLicheng
 */
public class ConnectedItem extends Item {

    private CommunicationInterface client;

    /**
     * 实例化数据库中已存在的监控项。
     * <br />
     *
     * 这里的<code>client</code>参数用于向客户端发送配置信息，客户端发送
     * 的监控数据的读取需要由外部逻辑调用{@link #saveData(List)}方法进行。
     *
     * @param dbInterface 数据库访问接口。
     * @param client 客户端通讯连接。
     * @param id 已存在的监控项ID。
     * @throws ItemNotExistsException 若ID不存在则抛出此异常。
     */
    public ConnectedItem(DatabaseInterface dbInterface, CommunicationInterface client,
            int id) throws ItemNotExistsException {
        super(dbInterface, id);
        this.client = client;
    }

    /**
     * 创建一个新的监控项。新监控项创建后，会发送消息到所属客户端，通知其新建监控项
     * ID。此时客户端不会执行任何采集数据的操作，效果就像如同调用了
     * {@link #pauseDataSending()}方法。因此在设置完成需要手动调用
     * {@link #resumeDataSending()}方法来使得客户端开始数据采集和发送。
     *
     * @param dbInterface 数据库访问接口。
     * @param client 客户端通讯连接。
     * @param name 新监控项名称。
     * @param nodeID 所属节点的ID。
     * @throws ItemExistsException 当监控项名已存在时抛出此异常。
     */
    public ConnectedItem(DatabaseInterface dbInterface, 
            CommunicationInterface client, String name, int nodeID)
            throws ItemExistsException {
        super(dbInterface);
    }

    @Override
    protected void removed() {
        
    }

    /**
     * 设置监控项名称。
     *
     * @param name 此监控项的新名称。
     * @throws ItemExistsException 当监控项名已存在时抛出此异常。
     */
    public void setName(String name) throws ItemExistsException {
        
    }

    /**
     * 设置出现警告时要将其转发的邮件地址等联系方式。
     *
     * @param contect 联系方式。
     */
    public void setWarningContect(WarningContect contect) {
        
    }

    /**
     * 设置数据获取脚本。
     * <br />
     *
     * 数据获取脚本设置后将会被立即发送到客户端，服务器上并不会保存此脚本的
     * 任何内容。
     *
     * @param monitorScript 新的数据获取脚本。
     * @see #pauseDataSending()
     */
    public void setMonitorScript(ItemScript monitorScript) {

    }

    /**
     * 返回数据获取脚本。
     * <br />
     *
     * 由于服务器上没有保存数据获取脚本，因此每次需要得到此脚本时都要从客户端
     * 获取。
     *
     * @return 数据获取脚本。
     */
    public ItemScript getMonitorScript() {
        return null;
    }

    /**
     * 设置数据验证脚本。此脚本为JavaScript。
     * <br />
     *
     * 数据验证脚本设置后将会被立即发送到客户端，服务器上并不会保存此脚本的
     * 任何内容。
     * 
     * @param javaScript 新的数据验证脚本。
     * @see #pauseDataSending()
     */
    public void setValidateScript(String javaScript) {

    }

    /**
     * 返回数据验证脚本。
     * <br />
     *
     * 由于服务器上没有保存数据验证脚本，因此每次需要得到此脚本时都要从客户端
     * 获取。
     *
     * @return 数据验证脚本。
     */
    public String getValidateScript() {
        return null;
    }

    /**
     * 设置数据采集时间间隔。此值以分钟为单位。可设置的范围为1分钟到1天。调用此方
     * 法后，设置的新时间间隔会被立即发送的客户端。
     * <br />
     *
     * 注意：修改数据采集时间间隔会导致图表的某些计算（如积分、求导）失败。因此
     * 这些图表中的监控值的历史记录会被完全删除。
     *
     * @param interval 新的时间间隔。
     * @throws IllegalArgumentException 若新间隔不在1分钟到1天内则抛出此异常。
     * @see #pauseDataSending()
     */
    public void setRunInterval(long interval) throws IllegalArgumentException {

    }

    /**
     * 发送消息给客户端要求其暂停数据采集和发送。在对参数进行设置时，应该先调用此
     * 方法，以保证客户端不会在参数没有完全设置完成前发送不一致的监控记录信息。
     * <br />
     *
     * 注意：此方法只会使客户端暂停当前监控项的数据发送，而不会影响其他监控项。而
     * 在调用此方法后到调用resumeDataSending方法前产生的所有数据记录都丢弃。（若
     * 客户端在此期间重新启动，则可能自行恢复数据采集和发送。）
     *
     * @see #resumeDataSending()
     */
    public void pauseDataSending() {

    }

    /**
     * 发送消息给客户端要求其开始数据采集和发送。在调用{@link #pauseDataSending()}
     * 方法后调用此方法可恢复客户端运行。
     *
     * @see #pauseDataSending()
     */
    public void resumeDataSending() {
        
    }

    /**
     * 保存客户端发送的监控数据。此方法会将相应的数据存入数据库。此方法还会处理
     * 客户端发出的警报。
     * <br />
     *
     * 此方法会调用相应的监控图表的saveData方法来存储。
     *
     * @param values 监控结果集合。
     */
    public void saveData(List<Result> values) {

    }
}
